from fastapi import APIRouter, Depends
from sqlmodel import Session
from crud.systems import org as org_crud
from common import response_code, exception
import models, utility
from dependencies import engine, SessionDep
from typing import Annotated
from routers.auth import get_current_sys_user


router = APIRouter()


"""查询当前用户拥有权限全部组织

Keyword arguments:
None
Return: response -- 响应体
"""


@router.get(
    "/api/system/org",
    tags=["组织机构管理"],
    summary="查询用户拥有权限的全部组织机构",
    response_model=models.RespJsonOrg,
)
async def get_user_access_org(
    user: Annotated[models.SystemUser,
                    Depends(get_current_sys_user)],
    session: SessionDep = Session(engine),
    response: models.RespJsonOrg = Depends(
        response_code.RespSuccessJson.resp_200),
):
    # 查询当前用户拥有权限组织机构
    orgs = org_crud.get_user_access_org(user, session)

    # 返回数据
    response.data = orgs

    return response


"""新增组织机构

Keyword arguments:
argument -- description
Return: return_description
"""


@router.post(
    "/api/system/org",
    tags=["组织机构管理"],
    summary="新增组织机构",
    response_model=models.RespJsonOrg,
)
async def create_org(
    org_create: models.SystemOrgCreate,
    user: Annotated[models.SystemUser,
                    Depends(get_current_sys_user)],
    session: SessionDep = Session(engine),
    response: models.RespJsonOrg = Depends(
        response_code.RespSuccessJson.resp_201),
):
    # 查询当前用户拥有权限组织机构
    orgs = org_crud.get_user_access_org(user, session)
    # 将orgs树状结构转化成列表
    orgs_list = utility.general.build_tree_list(orgs)
    # 获取当前用户拥有权限组织机构id列表
    org_ids = [org["id"] for org in orgs_list]
    # 获取当前用户组织机构id
    user_org_id = user.org_id

    # 查询父级组织机构id是否存在
    if org_create.parent_id and session.get(models.SystemOrg, org_create.parent_id) is None:
        raise exception.create_http_exception(status_code=400,
                                              detail="父级组织机构不存在")
    # 校验组织机构名称和编码是否已存在
    elif org_crud.get_org(org_create.name):
        raise exception.create_http_exception(status_code=400,
                                              detail="组织机构名称已存在")
    # 校验组织机构编码是否已存在
    elif org_crud.get_org(org_create.code):
        raise exception.create_http_exception(status_code=400,
                                              detail="组织机构编码已存在")
    # 校验父级组织机构id是否在当前用户拥有权限的组织机构id列表中
    elif org_create.parent_id not in org_ids and user_org_id:
        raise exception.create_http_exception(status_code=400,
                                              detail="没有权限添加该组织机构")

    # 新增组织机构
    org_crud.create_org(org_create, user, session)

    return response


"""编辑组织机构

Keyword arguments:
id -- 组织机构id
org_update -- 组织机构更新参数
Return: response -- 响应体
"""


@router.put(
    "/api/system/org/{id}",
    tags=["组织机构管理"],
    summary="编辑组织机构",
    response_model=models.RespJsonOrg,
)
async def update_org(
    id: int,
    org_update: models.SystemOrgUpdate,
    user: Annotated[models.SystemUser, Depends(get_current_sys_user)],
    session: SessionDep = Session(engine),
    response: models.RespJsonOrg = Depends(response_code.RespSuccessJson.resp_202),
):
    # 查询当前用户拥有权限组织机构
    orgs = org_crud.get_user_access_org(user, session)
    # 将orgs树状结构转化成列表
    orgs_list = utility.general.build_tree_list(orgs)
    # 获取当前用户拥有权限组织机构id列表
    org_ids = [org["id"] for org in orgs_list]
    # 获取当前用户组织机构id
    user_org_id = user.org_id

    print(f"当前用户机构id: {user_org_id}")
    print(f"当前用户所属父级机构id: {org_update.parent_id}")

    # 校验父级组织机构id是否存在
    if (
        org_update.parent_id
        and session.get(models.SystemOrg, org_update.parent_id) is None
    ):
        raise exception.create_http_exception(
            status_code=400, detail="父级组织机构不存在"
        )
    # 校验组织机构是否存在
    elif (
        org_crud.get_org(org_update.name) and org_crud.get_org(org_update.name).id != id
    ):
        raise exception.create_http_exception(
            status_code=400, detail="组织机构名称已存在"
        )
    # 校验组织机构编码是否存在
    elif (
        org_crud.get_org(org_update.code) and org_crud.get_org(org_update.code).id != id
    ):
        raise exception.create_http_exception(
            status_code=400, detail="组织机构编码已存在"
        )
    # 校验父级组织机构id是否在当前用户拥有权限的组织机构id列表中
    elif (org_update.parent_id not in org_ids and user_org_id):
        raise exception.create_http_exception(status_code=400,
                                            detail="没有权限编辑该组织机构")
    # 校验父级组织机构id不能为自己
    elif org_update.parent_id == id:
        raise exception.create_http_exception(
            status_code=400, detail="父级组织机构不能为自己")

    # 更新组织机构
    org_crud.update_org(id, org_update, user, session)

    return response


"""删除组织机构

Keyword arguments:
id -- 组织机构id
Return: response -- 响应体
"""


@router.delete(
    "/api/system/org/{id}",
    tags=["组织机构管理"],
    summary="删除组织机构",
    response_model=models.RespJsonOrg,
)
async def delete_org(
    id: int,
    user: Annotated[models.SystemUser,
                    Depends(get_current_sys_user)],
    session: SessionDep = Session(engine),
    response: models.RespJsonOrg = Depends(
        response_code.RespSuccessJson.resp_204),
):
    # 查询组织机构是否存在
    org = session.get(models.SystemOrg, id)

    if org is None:
        raise exception.create_http_exception(status_code=400,
                                              detail="组织机构不存在")
    # 删除组织机构
    org_crud.delete_org(id, user, session)
    return response
